/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bomberman.pl.divano.gra;

import bomberman.pl.divano.gra.elementy.cBomba;
import bomberman.pl.divano.gra.elementy.cOgien;
import bomberman.pl.divano.gra.elementy.cPowerUp;
import bomberman.pl.divano.gra.elementy.cPustePole;
import bomberman.pl.divano.gra.elementy.cScianaKruszaca;
import bomberman.pl.divano.gra.elementy.cScianaTrwala;
import java.io.Console;
import java.util.Random;
import java.util.Vector;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 *
 * @author divano
 */
public class Gra implements STAŁE {

	private Vector<Aktor> aktorzy;
	private Plansza plansza;
	private ConcurrentLinkedQueue<Zmiany> zmiany;
	private Aktor aktor;
	private Vector<cBomba> katalogBomby;
	private Vector<cOgien> katalogOgien;
	private Vector<cScianaKruszaca> katalogScianaKruszaca;
	private boolean serwer;
	private Integer iloscZywychGraczy;
	private boolean koniecGry;

	public Gra() {
		aktorzy = new Vector<Aktor>();
		plansza = new Plansza();
		zmiany = new ConcurrentLinkedQueue<Zmiany>();
		aktor = new Aktor(1, 1, 1);
		katalogBomby = new Vector<cBomba>();
		katalogOgien = new Vector<cOgien>();
		katalogScianaKruszaca = new Vector<cScianaKruszaca>();
		serwer = false;
		iloscZywychGraczy = 0;
		koniecGry = false;
	}

	public Gra(boolean arg) {
		aktorzy = new Vector<Aktor>();
		plansza = new Plansza();
		zmiany = new ConcurrentLinkedQueue<Zmiany>();
		aktor = new Aktor(1, 1, 1);
		katalogBomby = new Vector<cBomba>();
		katalogOgien = new Vector<cOgien>();
		katalogScianaKruszaca = new Vector<cScianaKruszaca>();
		serwer = arg;
		iloscZywychGraczy = 0;
		koniecGry = false;
	}

	public ConcurrentLinkedQueue<Zmiany> getAktualnaPlansza(int kolorGracza) {
		//pszeszukiwanie całej planszy i zwrocenie
		//wszystkiego jako wektora zmian
		ConcurrentLinkedQueue<Zmiany> plansz = new ConcurrentLinkedQueue<Zmiany>();
		//Dodawania aktorów do wektora zmian;
		this.iloscZywychGraczy = 0;
		for (int i = 0; i < aktorzy.size(); i++) {
			if (aktorzy.get(i).getKolor() != kolorGracza) {
				Aktor a = aktorzy.get(i);
				plansz.add(new Zmiany(a.getPozX(), a.getPozY(), STAŁE.AKTOR, true, false, 0, a.getKolor()));
				System.out.println("A: " + a.getPozX() + " \\m/" + a.getPozY() + "\\m/" + a.getKolor());
			}
			this.iloscZywychGraczy++;
		}
		System.out.println("W zmiany getZmiany mamy iloscZywychGraczy:" + this.iloscZywychGraczy);
		return plansz;
	}

	public void setZmiany(Zmiany arg) {
		// warunekt jesli zmiana jest poprawna
		//to dodaj ja do vectora zmian
		//System.out.println(":P " + arg.getTyp() + ":P " + arg.getKolor() + ":D " + arg.getX() + " : " + STAŁE.KATEGORIA_BOMBA);
		Integer kierunki[][];
		kierunki = new Integer[4][2];
		kierunki[0][0] = 0;
		kierunki[1][0] = 1;
		kierunki[2][0] = 0;
		kierunki[3][0] = -1;

		kierunki[0][1] = -1;
		kierunki[1][1] = 0;
		kierunki[2][1] = 1;
		kierunki[3][1] = 0;
		//System.out.println("nie dziala0");
		if (arg.isWstaw() == false) {
			//System.out.println("nie dziala1");
			if (arg.getTyp().equals(STAŁE.AKTOR)) {
				Aktor tmpa = null;
				int i;
				this.iloscZywychGraczy = 0;
				for (i = 0; i < aktorzy.size(); i++) {
					if (aktorzy.get(i).getKolor().equals(arg.getKolor())) {
						if (!aktorzy.get(i).isCzyZabity()) {
							tmpa = aktorzy.get(i);
						} else {
							return;
						//tmpa=null;
						}
					//  break;
					}
					this.iloscZywychGraczy++;

				}
				System.out.println("W setZmiany mamy iloscZywychGraczy:" + this.iloscZywychGraczy);
				//System.out.println("nie dziala2");
				if (tmpa != null) {
					//System.out.println("nie dziala3");
					if (arg.isUsun() == false && arg.isWstaw() == false) {
						//System.out.println("nie dziala4");
						// sprawdzanie kolizji :)
						int tmp1 = tmpa.getPozX();
						int tmp2 = tmpa.getPozY();
						tmp1 = tmp1 + kierunki[arg.getKierunek()][0];
						//tmpa.setPozX(tmp);
						tmp2 = tmpa.getPozY();
						tmp2 = tmp2 + kierunki[arg.getKierunek()][1];
						//tmpa.setPozY(tmp);
						Boolean pozwolenie = true;
						for (int u = 0; u < STAŁE.WARSTWY && this.serwer; u++) {
							if (this.plansza.getElement(tmp1, tmp2, u).getCzyMoznaChodzic() == false) {
								pozwolenie = false;
								arg.setTyp(STAŁE.KATEGORIA_BŁĘDNA_ZMIANA);
							}
						//System.out.println("JA JA JA " + this.plansza.getElement(tmpa.getPozX(), tmpa.getPozY(), u));
						}
						//jezeli na miejscu power upa nie ma pustego pola to znaczy ze jest power up :D


						if (pozwolenie == true) {
							if (this.plansza.getElement(tmp1, tmp2, STAŁE.KATEGORIA_POWERUP).toString().equals("power") && this.serwer) {
								System.out.println(" NOWE NOWE NOWE NOWE NOWE NOWE NOWE NOWE NOWE wszedłem   " + this.plansza.getElement(tmp1, tmp2, STAŁE.KATEGORIA_POWERUP).toString());
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");
								System.out.println("");

								Element pusty;
								pusty = new cPustePole();
								pusty.setCzyMoznaChodzic(true);
								pusty.setCzyZniszczalny(false);
								this.plansza.setElement(tmp1, tmp2, STAŁE.KATEGORIA_POWERUP, pusty);
								zmiany.add(new Zmiany(tmp1, tmp2, STAŁE.KATEGORIA_POWERUP, false, true, 0));
								Integer zasiegBomby;
								zasiegBomby = tmpa.getZasiegBomby();
								tmpa.setZasiegBomby(zasiegBomby + 1);
								System.out.println(" NOWE wYszedłem");
							}

							tmpa.setPozX(tmp1);
							tmpa.setPozY(tmp2);
							System.out.println(tmpa.getPozX() + " :) " + tmpa.getPozY() + " :) " + tmpa.getKolor());
							if (arg.getKolor().equals(getAktor().getKolor())) {
								aktor.setPozX(tmpa.getPozX());
								aktor.setPozY(tmpa.getPozY());
							}
						}
					} else if (arg.isUsun()) {
						aktorzy.remove(i);
					}
				} else {
					System.out.println("Nie znaleziono Aktora");
				}
			}
		} else {
			if (arg.getTyp() == STAŁE.AKTOR && arg.isUsun() == false) {
				aktorzy.add(new Aktor(arg.getX(), arg.getY(), arg.getKolor()));
			}
			if (arg.getTyp() == STAŁE.AKTOR && arg.isUsun() == true) {
				int yui = 0;
				for (Aktor a : aktorzy) {
					if (arg.getKolor().equals(a.getKolor())) {

						/*if (serwer == true && !a.isCzyZabity()) {
						if (this.iloscZywychGraczy > 0) {
						this.iloscZywychGraczy--;
						}

						System.out.println("1) Ilosc zywych graczy:" + this.iloscZywychGraczy);
						if (this.iloscZywychGraczy == 0) {
						// tutaj sygnal zeby zakonczyc gre

						zmiany.add(new Zmiany(10, 10, STAŁE.KATEGORIA_KONIEC_GRY, false, false, 0, arg.getKolor()));

						}
						}*/
						a.setCzyZabity(true);
						System.out.println("Mamy trupa: " + a.getKolor());
					}
					if (a.isCzyZabity() == false && this.serwer) {
						yui++;
					}

				}
				if (this.serwer && yui <= 1 && aktorzy.size() > 1) {
					zmiany.add(new Zmiany(10, 10, STAŁE.KATEGORIA_KONIEC_GRY, false, false, 0, arg.getKolor()));
				}
				System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
			}
		}
		if (arg.getTyp().equals(STAŁE.KATEGORIA_OGIEN)) {
			// przyszla zmiana dla pola z ogniem
			if (arg.isWstaw() == true) {
				// wstawiamy
				// z mysla trzeba to zrobic pozniej
				cOgien tmp;
				tmp = new cOgien();
				//!!!!!!!!  tmp.setCzasPowstaniaOgnia(PUSTEPOLE);
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(true);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			} else if (arg.isUsun() == true) {
				// usuwamy

				Element tmp;
				tmp = new cPustePole();
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(false);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_SCIANA_KRUSZACA)) {
			// przyszla zmiana dla pola sciana kruszaca
			if (arg.isWstaw() == true) {
				/*			Sciany kruszacej nie bedziemy wstawiac
				cScianaKruszaca tmp = new cScianaKruszaca();
				// !!!!!! tmp.setCzasNastapieniaKruszenia(AKTOR);
				tmp.setCzyMoznaChodzic(false);
				tmp.setCzyZniszczalny(true);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
				 * */
			} else if (arg.isUsun() == true) {
				// usuwamy

				Element tmp;
				tmp = new cPustePole();
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(false);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_SCIANA_TRWALA)) {
			// przyszla zmiana dla pola sciana trwala
			if (arg.isWstaw() == true) {
				// wstawiamy
				cScianaTrwala tmp = new cScianaTrwala();
				tmp.setCzyMoznaChodzic(false);
				tmp.setCzyZniszczalny(false);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			} else if (arg.isUsun() == true) {
				// usuwamy
				Element tmp;
				tmp = new cPustePole();

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_SCIANA_ZNISZCZALNA)) {
			// prszyszla zmiana dla pola sciagna zniszczalna
			if (arg.isWstaw() == true) {
				// wstawiamy
			} else if (arg.isUsun() == true) {
				// usuwamy
				Element tmp;
				tmp = new cPustePole();
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(true);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_POWERUP)) {
			// przyszla zmiana dla pola powerup
			if (arg.isWstaw() == true) {
				Element nowyPowerUp = new cPowerUp(true);
				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), nowyPowerUp);
			} else if (arg.isUsun() == true) {
				// usuwamy
				Element tmp;
				tmp = new cPustePole();
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(true);
				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} /*else if (arg.getTyp() == STAŁE.BOMBA) {
		// przyszla zmiana dla pola bomba
		if (arg.isWstaw() == true) {
		// wstawiamy
		} else if (arg.isUsun() == true) {
		// usuwamy
		Element tmp;
		tmp = new cPustePole();

		this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
		}
		}*/ else if (arg.getTyp().equals(STAŁE.KATEGORIA_PUSTE_POLE)) {
			// przyszla zmiana dla pustego pola
			if (arg.isWstaw() == true) {
				// wstawiamy
			} else if (arg.isUsun() == true) {
				// usuwamy
				Element tmp;
				tmp = new cPustePole();

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_BOMBA)) {
			if (arg.isWstaw() == true) {
				if (this.serwer) {
					for (Aktor a : aktorzy) {
						if (a.getKolor().equals(arg.getKolor()) && a.isCzyZabity()) {
							return;
						}
					}
				}
				// wstawiam bombe
				cBomba tmp;
				tmp = new cBomba();
				//!!! tmp.setCzasPostawienia(KATEGORIA_OGIEN);
				tmp.setCzyMoznaChodzic(true);
				tmp.setCzyZniszczalny(true);
				tmp.setKolor(arg.getKolor());
				// aktorzy.get(arg.getKolor()).getZasiegBomby(
				for (Aktor moj : aktorzy) {
					if (moj.getKolor().intValue() == tmp.getKolor().intValue()) {
						tmp.setZasieg(moj.getZasiegBomby());
					}
				}
				//tmp.setZasieg(5);
				tmp.setCzasPostawienia(0);

				tmp.setX(arg.getX());
				tmp.setY(arg.getY());
				katalogBomby.add(tmp);

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			} else if (arg.isUsun() == true) {
				// usuwamy bombe
				Element tmp;
				tmp = new cPustePole();

				this.plansza.setElement(arg.getX(), arg.getY(), arg.getTyp(), tmp);
			}
		} else if (arg.getTyp().equals(STAŁE.KATEGORIA_KONIEC_GRY)) {
			// teraz trzeba powiedziec ze koniec
			setKoniecGry(true);
			System.out.println("Powinienem zamknac gre.");
		}
		zmiany.add(arg);
	}

	public ConcurrentLinkedQueue<Zmiany> getZmiany() {
		ConcurrentLinkedQueue<Zmiany> tmp = new ConcurrentLinkedQueue<Zmiany>();

		for (int i = 0; i < katalogBomby.size() && this.serwer; i++) {
			// tu sa wszystkie bomby
			//System.out.println("Wlazł");
			if (katalogBomby.get(i).getCzasPostawienia() > STAŁE.CZAS_DO_WYBUCHU) {
				// wybuchnij bombe
				tmp.add(new Zmiany(katalogBomby.get(i).getX(),
						katalogBomby.get(i).getY(),
						STAŁE.KATEGORIA_BOMBA,
						false,
						true, 0,
						katalogBomby.get(i).getKolor()));
				System.out.println("Wszedlem w pisanie ognia");
				//plansza.setElement(katalogBomby.get(i).getX(), katalogBomby.get(i).getY(), STAŁE.KATEGORIA_BOMBA, new cPustePole());
				int koniec = 0;
				for (int x = 0; x < katalogBomby.get(i).getZasieg(); x++) {
					System.out.println("wspolrzedna x = " + x);
					if (koniec == 1) {
						break;
					}
					for (int z = STAŁE.WARSTWY - 1; z >= 0; z--) {
						System.out.println("warstwa " + z);
						if (this.plansza.getElement(katalogBomby.get(i).getX() + x,
								katalogBomby.get(i).getY(), z).toInt() != STAŁE.KATEGORIA_PUSTE_POLE) {
							//znalazłem obiekt różny od pustego pola
							System.out.println("to nie jest pusty obiekt!!!");
							if (this.plansza.getElement(katalogBomby.get(i).getX() + x,
									katalogBomby.get(i).getY(), z).czyZniszczalny) {
								System.out.println("to jest zniszczalny obiekt!!!");
								// znalazlem obiekt zniszczalny
								//usuwam dany element
								System.out.println("Teraz wprowadzam zaminy - usuwam obiekt");
								tmp.add(new Zmiany(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY(), z, false, true, 0));

								// wstaw nowy element
                                    /*this.plansza.setElement(katalogBomby.get(i).getX()+x,katalogBomby.get(i).getY()
								, z, new cPustePole());*/
								// sprawdzam czy to sciana, jezeli tak to sciana kruszaca dostanie sie
								// katalogu scian kruszacych
								if (z == STAŁE.KATEGORIA_SCIANA_ZNISZCZALNA.intValue()) {
									this.katalogScianaKruszaca.add((cScianaKruszaca) this.plansza.getElement(
											katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY(), z - 1));
								}


								if (this.plansza.getElement(katalogBomby.get(i).getX() + x,
										katalogBomby.get(i).getY(), z).czyMoznaChodzic) {
									System.out.println("po tym obiekcie można chodzic!!!");
									//mozna na nim chodzic, czyli ogien idzie dalej

									//wstawiam ogien
									tmp.add(new Zmiany(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY(),
											STAŁE.KATEGORIA_POWERUP, false, true, 0));
									tmp.add(new Zmiany(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY(),
											STAŁE.KATEGORIA_OGIEN, true, false, 0));
									cOgien mojOgien = new cOgien(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY());
									mojOgien.setCzasPowstaniaOgnia(0);

									this.katalogOgien.add(mojOgien);
								/* this.plansza.setElement(katalogBomby.get(i).getX()+x, katalogBomby.get(i).getY(), STAŁE.KATEGORIA_OGIEN, mojOgien);*/
								// tutaj dodaje plomien do katalogu plomienia



								/*this.plansza.setElement(katalogBomby.get(i).getX()+x,
								katalogBomby.get(i).getY(), z, new cPustePole());
								this.plansza.setElement(katalogBomby.get(i).getX()+x,
								katalogBomby.get(i).getY(), STAŁE.KATEGORIA_OGIEN, new cOgien());*/
								} else {//nie mozna po nim chodzic
									System.out.println("nie mozna po nim chodzic - koniec");
									koniec = 1;
									break;
								}
							} else {	//obiekt niezniszzalny
								System.out.println("obiekt niezniszczalny - koniec");
								koniec = 1;
								break;
							}

						} else if (z == 0) {
							/*
							this.plansza.setElement(katalogBomby.get(i).getX()+x,
							katalogBomby.get(i).getY(), STAŁE.KATEGORIA_OGIEN, new cOgien());*/
							tmp.add(new Zmiany(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY(),
									STAŁE.KATEGORIA_OGIEN, true, false, 0));
							cOgien mojOgien = new cOgien(katalogBomby.get(i).getX() + x, katalogBomby.get(i).getY());
							mojOgien.setCzasPowstaniaOgnia(0);

							this.katalogOgien.add(mojOgien);

						}
					}
				}
				koniec = 0;
				for (int x = 0; x < katalogBomby.get(i).getZasieg(); x++) {

					if (koniec == 1) {
						break;
					}
					for (int z = STAŁE.WARSTWY - 1; z >= 0; z--) {
						if (this.plansza.getElement(katalogBomby.get(i).getX() - x,
								katalogBomby.get(i).getY(), z).toInt() != STAŁE.KATEGORIA_PUSTE_POLE) {
							//znalazłem obiekt różny od pustego pola
							if (this.plansza.getElement(katalogBomby.get(i).getX() - x,
									katalogBomby.get(i).getY(), z).czyZniszczalny) {
								// znalazlem obiekt zniszczalny
								//usuwam dany element
								tmp.add(new Zmiany(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY(), z, false, true, 0));

								// sprawdzam czy to sciana, jezeli tak to sciana kruszaca dostanie sie
								// katalogu scian kruszacych
								if (z == STAŁE.KATEGORIA_SCIANA_ZNISZCZALNA.intValue()) {
									this.katalogScianaKruszaca.add((cScianaKruszaca) this.plansza.getElement(
											katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY(), z - 1));
								}

								if (this.plansza.getElement(katalogBomby.get(i).getX() - x,
										katalogBomby.get(i).getY(), z).czyMoznaChodzic) {
									//mozna na nim chodzic, czyli ogien idzie dalej
									//wstawiam ogien
									tmp.add(new Zmiany(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY(),
											STAŁE.KATEGORIA_POWERUP, false, true, 0));
									tmp.add(new Zmiany(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY(),
											STAŁE.KATEGORIA_OGIEN, true, false, 0));

									cOgien mojOgien = new cOgien(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY());
									mojOgien.setCzasPowstaniaOgnia(0);

									this.katalogOgien.add(mojOgien);
								} else {//nie mozna po nim chodzic
									koniec = 1;
									break;
								}
							} else {	//obiekt niezniszzalny
								koniec = 1;
								break;
							}

						} else if (z == 0) {
							tmp.add(new Zmiany(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY(),
									STAŁE.KATEGORIA_OGIEN, true, false, 0));

							cOgien mojOgien = new cOgien(katalogBomby.get(i).getX() - x, katalogBomby.get(i).getY());
							mojOgien.setCzasPowstaniaOgnia(0);

							this.katalogOgien.add(mojOgien);
						}
					}
				}
				koniec = 0;
				for (int x = 0; x < katalogBomby.get(i).getZasieg(); x++) {

					if (koniec == 1) {
						break;
					}
					for (int z = STAŁE.WARSTWY - 1; z >= 0; z--) {
						if (this.plansza.getElement(katalogBomby.get(i).getX(),
								katalogBomby.get(i).getY() + x, z).toInt() != STAŁE.KATEGORIA_PUSTE_POLE) {
							//znalazłem obiekt różny od pustego pola
							if (this.plansza.getElement(katalogBomby.get(i).getX(),
									katalogBomby.get(i).getY() + x, z).czyZniszczalny) {
								// znalazlem obiekt zniszczalny
								//usuwam dany element
								tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x, z, false, true, 0));

								// sprawdzam czy to sciana, jezeli tak to sciana kruszaca dostanie sie
								// katalogu scian kruszacych
								if (z == STAŁE.KATEGORIA_SCIANA_ZNISZCZALNA.intValue()) {
									this.katalogScianaKruszaca.add((cScianaKruszaca) this.plansza.getElement(
											katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x, z - 1));
								}

								if (this.plansza.getElement(katalogBomby.get(i).getX(),
										katalogBomby.get(i).getY() + x, z).czyMoznaChodzic) {
									//mozna na nim chodzic, czyli ogien idzie dalej
									//wstawiam ogien
									tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x,
											STAŁE.KATEGORIA_POWERUP, false, true, 0));
									tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x,
											STAŁE.KATEGORIA_OGIEN, true, false, 0));

									cOgien mojOgien = new cOgien(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x);
									mojOgien.setCzasPowstaniaOgnia(0);

									this.katalogOgien.add(mojOgien);
								} else {//nie mozna po nim chodzic
									koniec = 1;
									break;
								}
							} else {	//obiekt niezniszzalny
								koniec = 1;
								break;
							}

						} else if (z == 0) {
							tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x,
									STAŁE.KATEGORIA_OGIEN, true, false, 0));

							cOgien mojOgien = new cOgien(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() + x);
							mojOgien.setCzasPowstaniaOgnia(0);

							this.katalogOgien.add(mojOgien);
						}
					}
				}
				koniec = 0;
				for (int x = 0; x < katalogBomby.get(i).getZasieg(); x++) {

					if (koniec == 1) {
						break;
					}
					for (int z = STAŁE.WARSTWY - 1; z >= 0; z--) {
						if (this.plansza.getElement(katalogBomby.get(i).getX(),
								katalogBomby.get(i).getY() - x, z).toInt() != STAŁE.KATEGORIA_PUSTE_POLE) {
							//znalazłem obiekt różny od pustego pola
							if (this.plansza.getElement(katalogBomby.get(i).getX(),
									katalogBomby.get(i).getY() - x, z).czyZniszczalny) {
								// znalazlem obiekt zniszczalny
								//usuwam dany element
								tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x, z, false, true, 0));

								// sprawdzam czy to sciana, jezeli tak to sciana kruszaca dostanie sie
								// katalogu scian kruszacych
								if (z == STAŁE.KATEGORIA_SCIANA_ZNISZCZALNA.intValue()) {
									this.katalogScianaKruszaca.add((cScianaKruszaca) this.plansza.getElement(
											katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x, z - 1));
								}

								if (this.plansza.getElement(katalogBomby.get(i).getX(),
										katalogBomby.get(i).getY() - x, z).czyMoznaChodzic) {
									//mozna na nim chodzic, czyli ogien idzie dalej
									//wstawiam ogien
									tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x,
											STAŁE.KATEGORIA_POWERUP, false, true, 0));
									tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x,
											STAŁE.KATEGORIA_OGIEN, true, false, 0));
									cOgien mojOgien = new cOgien(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x);
									mojOgien.setCzasPowstaniaOgnia(0);

									this.katalogOgien.add(mojOgien);
								} else {//nie mozna po nim chodzic
									koniec = 1;
									break;
								}
							} else {	//obiekt niezniszzalny
								koniec = 1;
								break;
							}

						} else if (z == 0) {
							tmp.add(new Zmiany(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x,
									STAŁE.KATEGORIA_OGIEN, true, false, 0));

							cOgien mojOgien = new cOgien(katalogBomby.get(i).getX(), katalogBomby.get(i).getY() - x);
							mojOgien.setCzasPowstaniaOgnia(0);

							this.katalogOgien.add(mojOgien);
						}
					}
				}
				katalogBomby.remove(i);
			} else {
				katalogBomby.get(i).setCzasPostawienia(katalogBomby.get(i).getCzasPostawienia() + STAŁE.INTERWAL);
			// zwiekszylem czas stania bomby

			}


		}
		for (int j = 0; j < this.katalogOgien.size(); j++) {
			// katalog ognia petla po elementach

			for (Aktor moj : aktorzy) {
				if (moj.getPozX() == this.katalogOgien.get(j).getX() && moj.getPozY() == this.katalogOgien.get(j).getY()) {
					//moj.setCzyZabity(true);
					setZmiany(new Zmiany(moj.getPozX(), moj.getPozY(), STAŁE.AKTOR, true, true, 0, moj.getKolor()));
					System.out.println("---------------------------------------------------------UMARŁEM!!!!" + moj.getKolor());
				}
			}

			if (katalogOgien.get(j).getCzasPowstaniaOgnia() > STAŁE.CZAS_DO_WYGASNIECIA) {
				// trzeba usunac obiekt ognia z planszy
				// i z katalogu
				// tmp.add(new Zmiany());
				this.setZmiany(new Zmiany(katalogOgien.get(j).getX(), katalogOgien.get(j).getY(), STAŁE.KATEGORIA_OGIEN, false, true, 0));
				katalogOgien.remove(j);
			} else {
				// tutaj tylko zwiekszamy czas jaki ogien jest juz osadzony na planszy
				katalogOgien.get(j).setCzasPowstaniaOgnia(katalogOgien.get(j).getCzasPowstaniaOgnia() + STAŁE.INTERWAL);
			}
		}
		for (int j = 0; j < this.katalogScianaKruszaca.size(); j++) {
			// katalog sciany petla po elementach

			if (katalogScianaKruszaca.get(j).getCzasNastapieniaKruszenia() > STAŁE.CZAS_DO_ZNIKNIECIA) {
				// trzeba usunac obiekt sciany kruszacej z planszy
				// i z katalogu
				// tmp.add(new Zmiany());
				this.setZmiany(new Zmiany(katalogScianaKruszaca.get(j).getX(), katalogScianaKruszaca.get(j).getY(), STAŁE.KATEGORIA_SCIANA_KRUSZACA, false, true, 0));
				Random generator = new Random();
				int pierwszy = generator.nextInt();
				int drugi = generator.nextInt();
				if (pierwszy > drugi) {
					this.setZmiany(new Zmiany(katalogScianaKruszaca.get(j).getX(), katalogScianaKruszaca.get(j).getY(), STAŁE.KATEGORIA_POWERUP, true, false, 0));
				}
				katalogScianaKruszaca.remove(j);
			} else {
				// tutaj tylko zwiekszamy czas jaki sciana kruszaca jest juz osadzona na planszy
				katalogScianaKruszaca.get(j).setCzasNastapieniaKruszenia(katalogScianaKruszaca.get(j).getCzasNastapieniaKruszenia() + STAŁE.INTERWAL);
			}
		}

		for (Zmiany a : tmp) {
			setZmiany(a);
		}
		ConcurrentLinkedQueue<Zmiany> tmpa = zmiany;
		//funkcja szukająca zmian;
		//wybuchajacych bomb
		//niszczacych scian etc etc 4 fun :)
		//zmiany = new ConcurrentLinkedQueue<Zmiany>();
		return tmpa;
	}

	/**
	 * @return the plansza
	 */
	public Plansza getPlansza() {
		return plansza;
	}

	/**
	 * @param plansza the plansza to set
	 */
	public void setPlansza(Plansza plansza) {
		this.plansza = plansza;
	}

	/**
	 * @return the aktorzy
	 */
	public Vector<Aktor> getAktorzy() {
		return aktorzy;
	}

	/**
	 * @param aktorzy the aktorzy to set
	 */
	public void setAktorzy(Vector<Aktor> aktorzy) {
		this.aktorzy = aktorzy;
	}

	@Override
	public String toString() {
		String napis;
		napis = new String();
		String znak = new String();
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 20; j++) {
				znak = ".";
				for (int k = 0; k < aktorzy.size(); k++) {
					if (aktorzy.get(i).getPozX() == i && aktorzy.get(i).getPozY() == j) {
						znak = aktorzy.get(i).getKolor().toString();
					}
				}
				napis.concat(znak);
			}
			napis.concat("\n");
		}

		return napis;
	}

	/**
	 * @return the aktor
	 */
	public Aktor getAktor() {

		return aktor;
	}

	/**
	 * @param aktor the aktor to set
	 */
	public void setAktor(Zmiany arg) {
		this.aktor = new Aktor(arg.getX(), arg.getY(), arg.getKolor());
	//aktorzy.add(this.aktor);
	}

	/**
	 * @return the koniecGry
	 */
	public boolean isKoniecGry() {
		return koniecGry;
	}

	/**
	 * @param koniecGry the koniecGry to set
	 */
	public void setKoniecGry(boolean koniecGry) {
		this.koniecGry = koniecGry;
	}
}

